package leetcode.cn;

/**
 * @version 1.8
 * @Author Djx_hmbb
 * @Date 2023/10/7 9:57
 * @注释:376.摆动序列
 */

/*如果连续数字之间的差严格地在正数和负数之间交替，则数字序列称为 摆动序列 。第一个差（如果存在的话）可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。

例如， [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ，因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。
相反，[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列，第一个序列是因为它的前两个差值都是正数，第二个序列是因为它的最后一个差值为零。
子序列 可以通过从原始序列中删除一些（也可以不删除）元素来获得，剩下的元素保持其原始顺序。
给你一个整数数组 nums ，返回 nums 中作为 摆动序列 的 最长子序列的长度 。

示例 1：
输入：nums = [1,7,4,9,2,5]
输出：6
解释：整个序列均为摆动序列，各元素之间的差值为 (6, -3, 5, -7, 3) 。

示例 2：
输入：nums = [1,17,5,10,13,15,10,5,16,8]
输出：7
解释：这个序列包含几个长度为 7 摆动序列。
其中一个是 [1, 17, 10, 13, 10, 16, 8] ，各元素之间的差值为 (16, -7, 3, -3, 6, -8) 。

示例 3：
输入：nums = [1,2,3,4,5,6,7,8,9]
输出：2*/
public class BaiDongList {
    //最优解--简便快速易理解
    public static int wiggleMaxLength2(int[] nums){
        //思路：左边的趋势为left，右边的趋势为right。
        //如果right=0，则继续；如果left*right<=0，则说明两边趋势不同，该点为波峰或者波谷或者初始点
        //最后再移动left
        int n = nums.length;
        if(n<2) return n;

        int left = 0;//left=0,左边是平的、初始点；left>0,左边是上升点；反之亦然。
        int ret = 1;
        for (int i = 0; i < n - 1; i++) {
            int right = nums[i+1]-nums[i];
            if(right == 0)continue;
            if(left*right<=0){
                ret++;
                left = right;
            }
        }
        return ret;
    }

    //自己的解法
    public static int wiggleMaxLength1(int[] nums) {
        //思路：先找到第一个初始点，再通过t*mis的正负判断其他点

        int n = 1;//记录个数；
        if(nums.length <= 1){
            return nums.length;
        }
        int mis = 0;//差值
        int t = 0;//正负
        int i = 0;//记录找到第一个初始点的位置
        //先遍历一次数组，将初始点找出来
        for (int j = 0; j < nums.length - 1; j++) {
            mis = nums[j+1]-nums[j];
            if(mis>0){//上升
                t = -1;//代表下一个趋势要下降
                n++;
                i = j;
                break;//找到后退出循环
            }else if(mis<0){//下降
                t = 1;//代表下一个趋势要上升
                n++;
                i = j;
                break;//找到后退出循环
            }
            //找不到就循环找
        }
        //解下来找后面的部分
        for (i = i+1; i < nums.length-1; i++) {
            mis = nums[i+1]-nums[i];
            if((mis)*(t)>0){//如果符合预期，则会是正的
                n++;
                (t)*=(-1);//下一个预期就会是相反的
            }
        }
        return n;
    }

    public static void main(String[] args) {
        int[] nums = {1,7,4,9,2,5};
        int i = wiggleMaxLength1(nums);
        System.out.println(i);
    }
}
